package qw

import (
	"encoding/json"
	"errors"
	"log/slog"
	"net/url"
	"strings"

	"gitee.com/gxcc/go-utils/utils"
)

// GetMedia 获取临时素材
func (w *QYWXApi) GetMedia(mediaId string) (*utils.HttpResult, error) {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return nil, err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	values.Add("media_id", mediaId)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/media/get?" + values.Encode()

	// 调试
	//url += "&debug=1"

	res, err := w.getHttpSvc().HttpGet(reqUrl, nil)
	if err != nil {
		slog.Error(err.Error())
		return nil, err
	}

	if strings.Contains(res.Header.Get("Content-Type"), "application/json") {
		type Result struct {
			Errcode int    `json:"errcode"`
			Errmsg  string `json:"errmsg"`
		}
		var result Result
		if err := json.Unmarshal(res.Body, &result); err != nil {
			slog.Error(err.Error())
			return nil, err
		}
		return nil, errors.New("获取临时素材失败：" + result.Errmsg)
	}

	return res, nil
}

// UploadMedia 上传临时素材
// fileType: 媒体文件类型，分别有图片（image）、语音（voice）、视频（video），普通文件（file）
func (w *QYWXApi) UploadMedia(filePath, fileType string) (string, error) {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return "", err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	values.Add("type", fileType)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/media/upload?" + values.Encode()

	res, err := w.getHttpSvc().HttpPostMultipartForm(reqUrl, nil, nil, map[string]string{
		"media": filePath,
	})
	if err != nil {
		slog.Error(err.Error())
		return "", err
	}

	type Result struct {
		Errcode int    `json:"errcode"`
		Errmsg  string `json:"errmsg"`
		MediaId string `json:"media_id"`
	}
	var result Result
	if err := json.Unmarshal(res.Body, &result); err != nil {
		slog.Error(err.Error(), "response", string(res.Body))
		return "", err
	}

	if result.Errcode != 0 {
		return "", errors.New("上传临时素材失败，返回结果：" + string(res.Body))
	}

	return result.MediaId, nil
}

// UploadImg 上传图片
func (w *QYWXApi) UploadImg(filePath string) (string, error) {
	accessToken, err := w.GetAccessToken()
	if err != nil {
		return "", err
	}

	var values = url.Values{}
	values.Add("access_token", accessToken)
	reqUrl := "https://qyapi.weixin.qq.com/cgi-bin/media/uploadimg?" + values.Encode()

	res, err := w.getHttpSvc().HttpPostMultipartForm(reqUrl, nil, nil, map[string]string{
		"media": filePath,
	})
	if err != nil {
		slog.Error(err.Error())
		return "", err
	}
	slog.Debug(string(res.Body))

	type Result struct {
		Errcode int    `json:"errcode"`
		Errmsg  string `json:"errmsg"`
		Url     string `json:"url"`
	}
	var result Result
	if err := json.Unmarshal(res.Body, &result); err != nil {
		return "", err
	}

	if result.Errcode != 0 {
		return "", errors.New("上传图片失败，返回结果：" + string(res.Body))
	}

	return result.Url, nil
}
